home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
BOSS_M01.C
< prev
next >
Wrap
Text File
|
2000-03-21
|
5KB
|
193 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* 直進、レーザー、退却 */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PALET_MAIN 0x0500
extern short obj_boss_m01;
short enemy_explode( ENEMY *ene );
static short MoveEnemyBossM01(ENEMY *);
/*static void TiniEnemyBossM01(ENEMY *);*/
static HIT_XY4 hit_p[]={-10-PLAYER_HIT_X,-10-PLAYER_HIT_Y,10+PLAYER_HIT_X,10+PLAYER_HIT_Y};
static HIT_XY4 hit_o[]={-10-OPTION_HIT_X,-10-OPTION_HIT_Y,10+OPTION_HIT_X,10+OPTION_HIT_Y};
static HIT_XY4 hit_s[]={-10,-10,10,10};
void InitEnemyBossM01Hit( void )
{
}
void InitEnemyBossM01(ENEMY *ene)
{
ene->angle = 192;
ene->vx = vx_tbl[15][192];
ene->vy = vy_tbl[15][192];
ene->pt = obj_boss_m01 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->hit_p[0] = &hit_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &hit_o[0];ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_s[0];ene->hit_s[1]=NULL;
ene->hp = 20;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyBossM01;
/* ene->func_enemy_tini = TiniEnemyBossM01;*/
}
static short MoveEnemyBossM01( ENEMY *ene )
{
unsigned char angle;
short Wait( ENEMY *ene, short time );
/* 爆発して2秒後に消す(レーザーが画面の外に出るのを待つ) */
if( ene->dead_count ){
if( ene->dead_count++ > 120 )
return (0); /* 消去 */
else
return (1);
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
ene->vx=vx_tbl[15][ene->angle];
ene->vy=vy_tbl[15][ene->angle];
switch (ene->state){
case 0:
/* 折り返す */
if( ENE_X < 192 ){
if( ene->arg != 2 ){
if( ENE_Y < 128+16 )
ene->arg=1;
else
ene->arg=0;
}
ene->state++;
}
break;
case 1:
ene->vx=ene->vy=0;
if( !Wait( ene, 120 ) ){
if( ene->count==20 ){
ESHOT *eshot;
switch ( level ){
case EASY:
/* レーザー */
eshot=MakeEShot(ESHOT_LASER01, ENE_X, ENE_Y, 5, 128, 4,0,ene);
eshot->box_x=-16-16;eshot->box_y=-16;
SetSE(SE_LASER01); /* 敵ショット音 */
break;
case NOMAL:
/* 太いレーザー */
eshot=MakeEShot(ESHOT_LASEREX, ENE_Y, ENE_Y, 5, 128, 4,0,ene);
eshot->box_x=-16-16;eshot->box_y=-16;
SetSE(SE_EXLASER); /* 敵ショット音 */
break;
case HARD:
/* 太いレーザー */
eshot=MakeEShot(ESHOT_LASEREX, ENE_Y, ENE_Y, 5, 128, 4,0,ene);
eshot->box_x=-16-16;eshot->box_y=-16;
MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
SetSE(SE_EXLASER); /* 敵ショット音 */
break;
}
}
}else
ene->state++;
break;
case 2:
if( ene->arg!=2 ){
if( ene->arg )
ene->angle-=2;
else
ene->angle+=2;
ene->angle&=255;
ene->pt = obj_boss_m01 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_ZAKO;
if( ene->angle == 64 )
ene->state++;
}else
ene->state++;
case 3:
/* 画面外に出たら消去 */
if( ENE_X < 0 +16+16 || ENE_X > 256 + 32 )
ene->dead_count=1;
}
/* ダメージを受けた時の処理 */
#if 1
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | PRIORITY_BOSS; /*パレット変更*/
/* 破壊された */
if((ene->hp -= ene->damage) <= 0) {
MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
SetSE(SE_EXPL_MBOSS); /* 爆発音 */
if(disp_level == DISP_LEVEL_HIGH)
MakeEffect (EFFECT_HAHENMINI, 0, ene->x, ene->y);
if(!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
ene->player->score += 3;
ene->dead_count=1;
ene->hit_p[0]=NULL;
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | PRIORITY_ZAKO;
#endif
#if 0
if(ENE_X < 128){
ene->lx = 127*65536;
ene->ly = 224*65536;
ene->vx = 0;
ene->vy = 0;
if( BITSNS(0x04) & BIT(1) ){ /* F */
while( BITSNS(0x04) & BIT(1) );
entry_counter_stop = 0;
return (0);
}
ene->angle++;
ene->angle&=255;
ene->pt = obj_boss_m01 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_ZAKO;
}
#endif
/* ene->hit_p[0] = &hit_p[ene->anim_count];
ene->hit_o[0] = &hit_o[ene->anim_count];
ene->hit_s[0] = &hit_s[ene->anim_count];
*/
xobj_set_st(ene);
return(1);
}
/*
static void TiniEnemyBossM01(ENEMY * p)
{
entry_control -= ENTRY_CONTROL_ADD;
}
*/